<%--
    Document   : fileUpload
    Created on : 26.02.2011, 00:30:55
    Author     : felix
    Description: Angelehnt an
                 Upload
                 http://www.coderanch.com/t/486472/open-source/Servlet-image-upload
                 MD5-Erstellung
                 http://snook.ca/archives/java/create_md5_hash
--%>

<%@ page contentType="text/html" pageEncoding="UTF-8" %>
<%@page import="java.security.MessageDigest"%>
<%@page import="java.util.Date"%>
<%@ page import="java.io.*" %>
<%@ include file="header.jsp" %>
<%
    // id initialisieren
    String id = request.getParameter("id");

    // type initialisieren
    String type = request.getParameter("type");

    // Alle möglichen types festlegen
    String[] types = new String[] {"icon","exercise","template"};

    // Wenn type in types enthalten ist ...
    if(type.equals(types[0]) || type.equals(types[1]) || type.equals(types[2])){

        // ContentType des Requests laden
        String contentType = request.getContentType();

        // Wenn contentType gesetzt ist und Werte als multipart übergeben wurden
        if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
            // Inputstream festlegen
            DataInputStream in = new DataInputStream(request.getInputStream());

            // Länge des Inhalts laden
            int formDataLength = request.getContentLength();

            // Gesamtgröße der Daten laden
            byte dataBytes[] = new byte[formDataLength];

            // Gelesene Bytes ...
            int byteRead = 0;

            // Insgesamt geladene Bytes
            int totalBytesRead = 0;

            // Hochgeladene Datei in Bytecode umwandeln
            while (totalBytesRead < formDataLength) {
                    byteRead = in.read(dataBytes, totalBytesRead, formDataLength);
                    totalBytesRead += byteRead;
            }

            String file = new String(dataBytes);

            // MD5 Summe der aktuellen Zeit erstellen

            // Aktuelles Datum festlegen
            Date newDate = new Date();

            // Zeitstempel in Millisekunden
            Long date = newDate.getTime();

            // Einzigartiger String aus Zeitstempel, type und id
            String plainText = date.toString() + type + id;

            // MD5 Instanziieren
            MessageDigest mdAlgorithm = MessageDigest.getInstance("MD5");

            // Klartext umwalden
            mdAlgorithm.update(plainText.getBytes());

            // Bytearray einlesen
            byte[] digest = mdAlgorithm.digest();

            // Ausgabe anlegen
            StringBuffer hexString = new StringBuffer();

            // Solange i kleiner als die Länge von digest ist
            for (int i = 0; i < digest.length; i++) {
                // plaintText setzen mit digest
                plainText = Integer.toHexString(0xFF & digest[i]);

                // Wenn Länge von plaintText kleiner als 2 ist ...
                if (plainText.length() < 2) {
                    // plainText 0 setzen + Rest von plainText
                    plainText = "0" + plainText;
                }

                // plainText zur Ausgabe hinzufügen
                hexString.append(plainText);
            }

            // MD5 Ende

            // Dateiendung initialisieren
            String extension = "";

            // Dateinamen auslesen
            String saveFile = file.substring(file.indexOf("filename=\"") + 10);
            saveFile = saveFile.substring(0, saveFile.indexOf("\n"));
            saveFile = saveFile.substring(saveFile.lastIndexOf("\\") + 1,saveFile.indexOf("\""));

            int lastIndex = contentType.lastIndexOf("=");
            String boundary = contentType.substring(lastIndex + 1,contentType.length());
            int pos;
            
            // Index der Datei auslesen
            pos = file.indexOf("filename=\"");
            pos = file.indexOf("\n", pos) + 1;
            pos = file.indexOf("\n", pos) + 1;
            pos = file.indexOf("\n", pos) + 1;
            int boundaryLocation = file.indexOf(boundary, pos) - 4;
            int startPos = ((file.substring(0, pos)).getBytes()).length;
            int endPos = ((file.substring(0, boundaryLocation)).getBytes()).length;

            // Dateiendung aus Dateinamen auslesen
            int i = saveFile.lastIndexOf('.');
            if (i > 0) {
                extension = saveFile.substring(i+1);
            }

            // Relativen Pfad initialisieren
            String relativeWebPath = null;

            // Wenn type ist icon
            if(type.equals("icon")){
                // Setze Iconpfad
                relativeWebPath = "pict/icons/";
            // Wenn type ist exercise
            } else if(type.equals("exercise")){
                // Setze Übungspfad
                relativeWebPath = "pict/exercise/";
            // Wenn type ist leer
            } else {
                // Setze Sportartpfad
                relativeWebPath = "pict/typeofsport/";
            }

            // Pfad und Dateinamen zusammensetzen
            relativeWebPath += hexString.toString();

            // Absoluten Pfad bilden
            String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);

            // Dateiendung an absoluten Pfad anhängen
            saveFile=absoluteDiskPath + "." + extension;

            // Neue Datei erstellen
            FileOutputStream fileOut = new FileOutputStream(saveFile);

            // Datei schreiben
            fileOut.write(dataBytes, startPos, (endPos - startPos));
            fileOut.flush();

            // Datei schließen
            fileOut.close();

            // Dateinamen in Datenbank schreiben
            // Wenn type ist icon ...
            if(type.equals("icon")){
                // Icon aktualisieren
                db.typeofsport.updateIcon(id, hexString.toString() + "." + extension);

                // Erfolgsmeldung setzen
                session.setAttribute("flash", "Icon gespeichert");
                session.setAttribute("flash_color", "green");
            
            // Wenn type ist exercise ...
            } else if(type.equals("exercise")){
                // Übungsbild aktualisieren
                db.pictures.updatePicture(id, hexString.toString() + "." + extension);

                // Erfolgsmeldung setzen
                session.setAttribute("flash", "Übungsbild gespeichert" );
                session.setAttribute("flash_color", "green");

            // Wenn type ist template ...
            } else if(type.equals("template")){
                // Sportarttemplate aktualisieren
                db.typeofsport.updateTemplate(id, hexString.toString() + "." + extension);

                // Erfolgsmeldung setzen
                session.setAttribute("flash", "Vorlage gespeichert");
                session.setAttribute("flash_color", "green");
            }

            // Zur index.jsp umleiten
            getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
        }
   } else {
        // Fehlermeldung setzen
        session.setAttribute("flash", "Datei wurde nicht gespeichert");
        session.setAttribute("flash_color", "red");
   }
%>
<%@ include file="footer.jsp" %>
